home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / mouse.swg / 0008_A GOOD Mouse Unit.pas < prev    next >
Pascal/Delphi Source File  |  1993-10-28  |  3KB  |  184 lines

  1.  
  2. UNIT AMOUSE; (* mouse/keyboard Routines *)
  3.  
  4. INTERFACE
  5.  
  6. CONST
  7.           MouseInstalled : Boolean = FALSE;
  8.  
  9. FUNCTION  InitMouse : WORD;
  10. PROCEDURE ShowMouseCursor;
  11. PROCEDURE HideMouseCursor;
  12. PROCEDURE SetMouseWindow (X1, Y1, X2, Y2 : WORD);
  13. PROCEDURE GetMousePos (VAR X, Y, button : WORD);
  14. PROCEDURE SetMousePos (X, Y : WORD);
  15. PROCEDURE GetButtonPressInfo (VAR X, Y, Button, NumberOfPresses : WORD);
  16. PROCEDURE GetButtonRelInfo (VAR X, Y, Button, NumberOfReleases : WORD);
  17. PROCEDURE KeyOrButton (VAR Code, X, Y, Button : WORD; VAR Ch : CHAR);
  18. FUNCTION  KEYPRESSED : BOOLEAN;
  19. FUNCTION  MousePRESSED : BOOLEAN;
  20. FUNCTION  MouseORKeyPRESSED : BOOLEAN;
  21.  
  22. IMPLEMENTATION
  23.  
  24. USES DOS;
  25.  
  26. CONST
  27.  
  28.   MIO    = $33;  (* Mouse Services       *)
  29.   KBIO   = $16;  (* BIOS Keyboard        *)
  30.  
  31. VAR
  32.    X, Y : WORD;
  33.    reg  : REGISTERS;
  34.  
  35.  
  36. FUNCTION KEYPRESSED : BOOLEAN; Assembler;
  37. ASM
  38.   PUSH DS
  39.   MOV AX, 40h
  40.   MOV DS, AX
  41.   CLI
  42.   MOV AX, [1Ah]
  43.   CMP AX, [1Ch]
  44.   STI
  45.   MOV AX, 0
  46.   JZ @NoPress
  47.   INC AX
  48.   @NoPress :
  49.   POP DS
  50. END;
  51.  
  52.  
  53. FUNCTION PollKey (VAR Status : WORD) : WORD;
  54. VAR s : WORD;
  55. BEGIN
  56.   asm
  57.     MOV AH, 01
  58.     INT KBIO
  59.     MOV @Result, AX
  60.     LAHF
  61.     AND AX, 64
  62.     MOV S, AX
  63.   END;
  64.   Status := s;
  65. END;
  66.  
  67. FUNCTION MousePressed : BOOLEAN;
  68. VAR B : WORD;
  69.   BEGIN
  70.   Asm
  71.     MOV AX, $0003
  72.     INT $33
  73.     MOV B,  BX
  74.   END;
  75.   MousePressed := (B <> 0);
  76.   END;
  77.  
  78. FUNCTION MouseORKeyPressed : BOOLEAN;
  79. VAR B : WORD;
  80.   BEGIN
  81.   Asm
  82.     MOV AX, $0003
  83.     INT $33
  84.     MOV B,  BX
  85.   END;
  86.   MouseORKeyPressed := (B <> 0) OR KeyPressed;
  87.   END;
  88.  
  89. PROCEDURE KeyOrButton (VAR Code, X, Y, Button : WORD; VAR Ch : CHAR);
  90.  (* wait for key or mouse click and returns data *)
  91. VAR Status : WORD;
  92. BEGIN
  93.   REPEAT
  94.     Code := PollKey (Status);
  95.     GetMousePos (X, Y, Button);
  96.   UNTIL (Button <> 0) OR (Status = 0);
  97.  
  98.   IF (LO (Status) = 0) AND (HI (Status) <> 0) THEN
  99.         Ch := CHR ( HI (Status) + 128 )
  100.       ELSE
  101.         Ch := CHR (LO (Status) );
  102. END;
  103.  
  104. FUNCTION InitMouse : WORD;
  105. BEGIN
  106.   Asm
  107.     MOV AX, $0000
  108.     INT MIO
  109.     MOV @Result, AX
  110.   END;
  111. END;
  112.  
  113. PROCEDURE ShowMouseCursor; Assembler;
  114. Asm
  115.   MOV AX, $0001
  116.   INT MIO
  117. END;
  118.  
  119. PROCEDURE HideMouseCursor; Assembler;
  120. Asm
  121.   MOV AX, $0002
  122.   INT MIO
  123. END;
  124.  
  125. PROCEDURE GetMousePos (VAR X, Y, Button : WORD);
  126. VAR X1, Y1, b : WORD;
  127. BEGIN
  128.   Asm
  129.     MOV AX, $0003
  130.     INT MIO
  131.     MOV b,  BX
  132.     MOV X1, CX
  133.     MOV Y1, DX
  134.   END;
  135.   X := X1;
  136.   Y := Y1;
  137.   Button := b;
  138. END;
  139.  
  140. PROCEDURE SetMousePos (X, Y : WORD); Assembler;
  141. Asm
  142.   MOV AX, $0004
  143.   MOV CX, X
  144.   MOV DX, Y
  145.   INT MIO
  146. END;
  147.  
  148. PROCEDURE GetButtonPressInfo (VAR X, Y, Button, NumberOfPresses : WORD);
  149. BEGIN
  150.   reg. AX := $0005;
  151.   reg. BX := Button;
  152.   INTR (MIO, reg);
  153.   Button := reg. AX;
  154.   X := reg. CX;
  155.   Y := reg. DX;
  156.   NumberOfPresses := reg. BX
  157. END;
  158.  
  159. PROCEDURE GetButtonRelInfo (VAR X, Y, Button, NumberOfReleases : WORD);
  160. BEGIN
  161.   reg. AX := $0006;
  162.   reg. BX := Button;
  163.   INTR (MIO, reg);
  164.   Button := reg. AX;
  165.   X := reg. CX;
  166.   Y := reg. DX;
  167.   NumberOfReleases := reg. BX
  168. END;
  169.  
  170. PROCEDURE SetMouseWindow (X1, Y1, X2, Y2 : WORD);
  171. BEGIN
  172.   reg. AX := $0007;
  173.   reg. CX := X1;
  174.   reg. DX := X2;
  175.   INTR ($33, reg);
  176.   INC (reg. AX, 1);
  177.   reg. CX := Y1;
  178.   reg. DX := Y2;
  179.   INTR (MIO, reg)
  180. END;
  181.  
  182. BEGIN
  183.   MouseInstalled := (InitMouse <> 0);
  184. END.